feat(k8s): external S3 for LakeFS & Lakekeeper, MinIO optional#6295
Open
aicam wants to merge 1 commit into
Open
feat(k8s): external S3 for LakeFS & Lakekeeper, MinIO optional#6295aicam wants to merge 1 commit into
aicam wants to merge 1 commit into
Conversation
… & Lakekeeper PR2 made the app tier (file-service, computing-unit-manager) S3-pluggable via the storage.s3 helpers. This completes the object-storage story so the whole chart can run against an external S3 store (e.g. AWS S3) instead of the bundled in-cluster MinIO, while keeping MinIO the default so on-prem is unchanged. - Chart.yaml: gate the minio subchart on `minio.enabled`. - values.yaml: add `minio.enabled: true`; add `lakekeeperInit.createBucket`, `warehouse.flavor`, and `warehouse.keyPrefix`; document the lakefs override. - lakekeeper-init-job: resolve S3 endpoint/credentials through the storage.s3 helpers instead of hardcoding the in-cluster MinIO; gate bucket creation on `createBucket`; drive the warehouse storage-profile from `flavor`/`keyPrefix` (`s3-compat` => endpoint + path-style; `aws` => neither). - external-names: only emit the MinIO ExternalName when `minio.enabled`. - minio-persistence: only emit the PV/PVC when `minio.enabled`. - values-aws.yaml: new example overlay (MinIO off, external S3, LakeFS region blockstore + injected creds, Lakekeeper warehouse with createBucket=false / flavor=aws). Default render is functionally unchanged (S3 env values still resolve to the in-cluster MinIO); `helm lint` passes for both the default and AWS value sets. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
Automated Reviewer SuggestionsBased on the
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes were proposed in this PR?
This completes the "make object storage pluggable" work by wiring the data tier (LakeFS blockstore + Lakekeeper Iceberg warehouse) to an external S3 store and adding a single switch to drop the in-cluster MinIO entirely. #5932 did the application tier (
storage.s3) and explicitly deferred this half. It is non-breaking: the default (on-prem / in-cluster MinIO) install renders the same set of resources.minio.enabledswitch (values.yaml, defaulttrue) to turn off the bundled MinIO subchart and point everything at external S3:Chart.yaml-- theminiodependency getscondition: minio.enabled.templates/on-prem/minio-persistence.yaml-- the MinIO PV/PVC is gated onminio.enabledas well asminio.persistence.enabled.templates/base/external-names/external-names.yaml-- the<release>-minioExternalNamealias (exposed to the computing-unit-pool namespace) is only rendered when MinIO is enabled; with external S3 the CU pods reach the store directly viaSTORAGE_S3_ENDPOINT.templates/base/lakekeeper/lakekeeper-init-job.yaml):STORAGE_S3_*env now resolves through the sharedtexera.s3.*helpers introduced in feat(k8s): make app-tier object storage configurable via storage.s3 #5932 (endpoint + credentials Secret name/keys) instead of hardcoding<release>-minio.lakekeeperInit.createBucket(defaulttrue) -- whenfalse, the job skipsmc mband logs that it is using a pre-existing external bucket. Needed because an external bucket already exists and its IAM principal may lacks3:CreateBucket.lakekeeperInit.warehouse.flavor--s3-compat(MinIO/other; emitsendpoint+path-style-access: true) or nativeaws(real AWS S3; omits both). New optionallakekeeperInit.warehouse.keyPrefixto isolate the warehouse within a shared bucket.values.yaml-- documentsminio.enabled, the LakeFS external-blockstore override path, and the newlakekeeperInitkeys.values-aws.yaml(new) -- a complete, copy-pasteable all-external-S3 overlay: MinIO off,storage.s3(endpoint/region/credentials orexistingSecret), LakeFS region-only S3 blockstore with credentials injected viaextraEnvVars, and Lakekeeperflavor: aws+createBucket: false.How it behaves:
ExternalNameall render as today.-f values-aws.yaml): no MinIO is deployed; the app tier, LakeFS, and Lakekeeper all target the external S3 buckets, and the Lakekeeper warehouse is registered with the native AWS flavor against a pre-existing bucket.Any related issues, documentation, discussions?
Closes #6294 (LakeFS blockstore + Lakekeeper warehouse external-S3 task).
Part of #5891 -- unify AWS (EKS) and on-premise Kubernetes deployment under
bin/k8s(parent feature).Follows #5932 (app-tier
storage.s3) and #5757 (Helm template reorg).How was this PR tested?
1. Render parity (default install unchanged).
helm template texera bin/k8son this branch vs onmainrenders the same set of resources;helm lint bin/k8spasses. The new{{- if }}guards (MinIO ExternalName, persistence, createBucket, flavor) all evaluate to their prior behavior whenminio.enabled/createBucketdefault totrue.2. External-S3 render.
helm template texera bin/k8s -f bin/k8s/values-aws.yamldeploys no MinIO subchart / PV / PVC / ExternalName, routes the Lakekeeper init job'sSTORAGE_S3_*at the external endpoint and credentials Secret, skips themc mbbucket-creation step, and registers the warehouse storage profile with"flavor": "aws"(noendpoint/path-style-access).helm lintpasses for this value set.3. End-to-end on a live EKS cluster with real AWS S3. Stood up an isolated EKS cluster (
us-west-2, its own AWS account, no MinIO) plus two pre-created S3 buckets (LakeFS blockstore + Iceberg warehouse) and an IAM user scoped to just those buckets with noCreateBucketpermission. Built all Texera service images from this branch, deployed the chart with an external-S3 overlay derived fromvalues-aws.yaml, and exercised the full stack:awsflavor, bucket-creation skipped against the pre-existing warehouse bucket).metadata.json+ data objects confirmed via the S3 API). This exercises the full external-S3 path: file-service reads the CSV from LakeFS -> S3, the computing-unit pod reaches the Lakekeeper REST catalog, and results are written to Iceberg -> S3 and read back.All test AWS resources (cluster, buckets, IAM user) were torn down afterward.
Operational note surfaced by the live test (not a chart defect, worth documenting): with a real external S3 store, dataset preview requires a CORS rule on the buckets (
GET/HEAD) because the presigned URLs are served cross-origin from*.s3.<region>.amazonaws.com, whereas the in-cluster MinIO was same-origin.No unit tests were added -- the change is limited to Helm chart values/templates, validated by the render diff,
helm lint, and the live end-to-end run above.Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Claude Opus 4.8)